import requests
from typing import Optional, Dict, Any
import os
import time

# os.environ["API_KEY"]="替换为自己的apikey或者在环境中进行配置"

def create_video(prompt):
    """
    生成视频并返回结果
    :param prompt: 文本提示，描述想要生成的视频内容
    :return: 一段5秒的视频
    """
    try:
        api_key = os.getenv("API_KEY")  # 从环境变量获取 API Key
        task_id = call_dashscope_t2v(prompt=prompt, api_key=api_key)
        print("接口调用成功，返回结果：")
        print(task_id)
        result = auto_query_until_complete(task_id=task_id, api_key=api_key)
        print("任务查询成功，返回结果：")
        print(result)
        return result
    except Exception as e:
        print(f"任务查询失败：{str(e)}")



def call_dashscope_t2v(
        prompt: str,
        api_key: str,
        model: str = "wan2.2-t2v-plus",
        video_size: str = "832*480",
        timeout: int = 30
) -> str:
    """
    第一步：提交文本生成视频任务，返回唯一的 task_id（用于后续查询结果）

    参数说明（同前，新增返回值说明）：
        返回值: str - 阿里云 DashScope 分配的任务ID（task_id），如"accc5b88-48ab-425b-b7b5-9a4f3b4938a4"
    """
    # 1. 校验必填参数
    if not isinstance(prompt, str) or len(prompt.strip()) == 0:
        raise ValueError("参数 'prompt' 不能为空（视频生成的文本提示）")
    if not isinstance(api_key, str) or len(api_key.strip()) == 0:
        raise ValueError("参数 'api_key' 不能为空（从阿里云 DashScope 控制台获取）")

    # 2. 构造请求信息
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis"
    headers = {
        "X-DashScope-Async": "enable",
        "Authorization": f"Bearer {api_key.strip()}",
        "Content-Type": "application/json"
    }
    payload = {
        "model": model.strip(),
        "input": {"prompt": prompt.strip()},
        "parameters": {"size": video_size.strip()}
    }

    # 3. 发送请求并提取 task_id
    try:
        response = requests.post(url=url, headers=headers, json=payload, timeout=timeout)
        response.raise_for_status()
        response_data = response.json()

        # 从返回结果中提取 task_id（按用户提供的返回格式解析）
        task_id = response_data.get("output", {}).get("task_id")
        if not task_id:
            raise ValueError(f"接口返回无有效 task_id，完整响应：{response_data}")

        print(f"任务提交成功！task_id: {task_id}")
        return task_id

    except requests.exceptions.RequestException as e:
        raise Exception(f"任务提交失败：{str(e)}")


def query_t2v_task(
        task_id: str,
        api_key: str,
        timeout: int = 30
) -> Dict[str, Any]:
    """
    第二步：根据 task_id 查询视频生成任务的状态/结果

    参数说明：
        task_id (str): 从 call_dashscope_t2v 函数获取的任务ID（必填）
        api_key (str): 同前（阿里云 DashScope API 密钥，必填）
        timeout (int): 请求超时时间（默认30秒）

    返回值：
        Dict[str, Any] - 任务查询结果，包含：
            - 未完成：task_status（如"PENDING"/"RUNNING"）、request_id 等
            - 已完成：video_url（视频下载链接）、duration（时长）、size（分辨率）等
            - 失败：error（错误信息）
    """
    # 1. 校验必填参数
    if not isinstance(task_id, str) or len(task_id.strip()) == 0:
        raise ValueError("参数 'task_id' 不能为空（需从任务提交函数获取）")
    if not isinstance(api_key, str) or len(api_key.strip()) == 0:
        raise ValueError("参数 'api_key' 不能为空")

    # 2. 构造查询请求（对应 curl 的 GET 方法）
    query_url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id.strip()}"  # 拼接 task_id 到 URL
    headers = {
        "Authorization": f"Bearer {api_key.strip()}",  # 无需 X-DashScope-Async 头
        "Content-Type": "application/json"
    }

    # 3. 发送 GET 请求并返回结果
    try:
        response = requests.get(url=query_url, headers=headers, timeout=timeout)
        response.raise_for_status()
        return response.json()

    except requests.exceptions.RequestException as e:
        raise Exception(f"任务查询失败：{str(e)}")


def auto_query_until_complete(
        task_id: str,
        api_key: str,
        interval: int = 10,
        max_retries: Optional[int] = None
) -> Dict[str, Any]:
    """
    （可选）自动循环查询任务，直至任务完成（成功/失败），无需手动重复调用

    参数说明：
        interval (int): 每次查询的间隔时间（默认10秒，避免频繁请求触发限流）
        max_retries (Optional[int]): 最大查询次数（None 表示无限重试，直到任务结束）

    返回值：
        Dict[str, Any] - 最终的任务结果（成功返回视频信息，失败返回错误信息）
    """
    retry_count = 0
    while True:
        # 检查是否超过最大重试次数
        if max_retries is not None and retry_count >= max_retries:
            raise Exception(f"已达到最大查询次数（{max_retries}次），任务未完成，请稍后手动查询")

        # 执行查询
        task_result = query_t2v_task(task_id=task_id, api_key=api_key)
        task_status = task_result.get("output", {}).get("task_status", "UNKNOWN")
        print(f"第 {retry_count + 1} 次查询 - 任务状态：{task_status}")

        # 判断任务状态，决定是否继续查询
        if task_status in ["SUCCEEDED", "FAILED"]:
            # 任务完成（成功/失败），返回最终结果
            return task_result
        else:
            # 任务未完成（PENDING/RUNNING），等待 interval 秒后重试
            time.sleep(interval)
            retry_count += 1



